home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / gfx / show / svoUtah22.lha / svoUtahRLE / source / URT / lib / rle_getskip.c < prev    next >
C/C++ Source or Header  |  1990-08-02  |  4KB  |  161 lines

  1. /*
  2.  * This software is copyrighted as noted below.  It may be freely copied,
  3.  * modified, and redistributed, provided that the copyright notice is 
  4.  * preserved on all copies.
  5.  * 
  6.  * There is no warranty or other guarantee of fitness for this software,
  7.  * it is provided solely "as is".  Bug reports or fixes may be sent
  8.  * to the author, who may or may not act on them as he desires.
  9.  *
  10.  * You may not include this software in a program or other software product
  11.  * without supplying the source, or without informing the end-user that the 
  12.  * source is available for no extra charge.
  13.  *
  14.  * If you modify this software, you should include a notice giving the
  15.  * name of the person performing the modification, the date of modification,
  16.  * and the reason for such modification.
  17.  */
  18. /* 
  19.  * rle_getskip.c - Skip scanlines on input.
  20.  * 
  21.  * Author:    Spencer W. Thomas
  22.  *         EECS Dept.
  23.  *         University of Michigan
  24.  * Date:    Wed Jun 27 1990
  25.  * Copyright (c) 1990, University of Michigan
  26.  */
  27.  
  28. #include <rle.h>
  29. #include <rle_code.h>
  30.  
  31. /* Read a two-byte "short" that started in VAX (LITTLE_ENDIAN) order */
  32. #define VAXSHORT( var, fp )\
  33.     { var = fgetc(fp)&0xFF; var |= (fgetc(fp)) << 8; }
  34.   
  35. /* Instruction format -- first byte is opcode, second is datum. */
  36.  
  37. #define OPCODE(inst) (inst[0] & ~LONG)
  38. #define LONGP(inst) (inst[0] & LONG)
  39. #define DATUM(inst) (inst[1] & 0xff)    /* Make sure it's unsigned. */
  40.  
  41. /*****************************************************************
  42.  * TAG( rle_getskip )
  43.  * 
  44.  * Skip the next scanline with data on it.
  45.  * Most useful for skipping to end-of-image.
  46.  * Inputs:
  47.  *     the_hdr:    Describes input image.
  48.  * Outputs:
  49.  *     Returns the number of the next scanline.  At EOF returns 32768.
  50.  * Assumptions:
  51.  *     rle_get_setup has been called.
  52.  * Algorithm:
  53.  *     Read input to the beginning of the next scanline, or to EOF or
  54.  *     end of image.
  55.  */
  56. unsigned int
  57. rle_getskip( the_hdr )
  58. rle_hdr *the_hdr;
  59. {
  60.     unsigned char inst[2];
  61.     register FILE *infile = the_hdr->rle_file;
  62.     int nc;
  63.  
  64.     /* Add in vertical skip from last scanline */
  65.     if ( the_hdr->priv.get.vert_skip > 0) 
  66.     the_hdr->priv.get.scan_y += the_hdr->priv.get.vert_skip;
  67.     the_hdr->priv.get.vert_skip = 0;
  68.  
  69.     if ( the_hdr->priv.get.is_eof )
  70.     return 32768;        /* too big for 16 bits, signal EOF */
  71.     
  72.     /* Otherwise, read and interpret instructions until a skipLines
  73.      * instruction is encountered.
  74.      */
  75.     for (;;)
  76.     {
  77.         inst[0] = getc( infile );
  78.     inst[1] = getc( infile );
  79.     if ( feof(infile) )
  80.     {
  81.         the_hdr->priv.get.is_eof = 1;
  82.         break;        /* <--- one of the exits */
  83.     }
  84.  
  85.     switch( OPCODE(inst) )
  86.     {
  87.     case RSkipLinesOp:
  88.         if ( LONGP(inst) )
  89.         {
  90.         VAXSHORT( the_hdr->priv.get.vert_skip, infile );
  91.         }
  92.         else
  93.         the_hdr->priv.get.vert_skip = DATUM(inst);
  94.         break;            /* need to break for() here, too */
  95.  
  96.     case RSetColorOp:
  97.         /* No-op here. */
  98.         break;
  99.  
  100.     case RSkipPixelsOp:
  101.         if ( LONGP(inst) )
  102.         {
  103.         (void)getc( infile );
  104.         (void)getc( infile );
  105.         }
  106.         break;
  107.  
  108.     case RByteDataOp:
  109.         if ( LONGP(inst) )
  110.         {
  111.             VAXSHORT( nc, infile );
  112.         }
  113.         else
  114.         nc = DATUM(inst);
  115.         nc++;
  116.         if ( the_hdr->priv.get.is_seek )
  117.         fseek( infile, ((nc + 1) / 2) * 2, 1 );
  118.         else
  119.         {
  120.         register int ii;
  121.         for ( ii = ((nc + 1) / 2) * 2; ii > 0; ii-- )
  122.             (void) getc( infile );    /* discard it */
  123.         }
  124.  
  125.         break;
  126.  
  127.     case RRunDataOp:
  128.         if ( LONGP(inst) )
  129.         {
  130.         (void)getc( infile );
  131.         (void)getc( infile );
  132.         }
  133.         (void)getc( infile );
  134.         (void)getc( infile );
  135.         break;
  136.  
  137.     case REOFOp:
  138.         the_hdr->priv.get.is_eof = 1;
  139.         break;
  140.  
  141.     default:
  142.         fprintf( stderr, "rle_getskip: Unrecognized opcode: %d\n", OPCODE(inst) );
  143.         exit(1);
  144.     }
  145.     if ( OPCODE(inst) == REOFOp )
  146.         break;            /* <--- the other loop exit */
  147.     if ( OPCODE(inst) == RSkipLinesOp )
  148.         break;
  149.     }
  150.  
  151.     /* Return the number of the NEXT scanline. */
  152.     the_hdr->priv.get.scan_y +=
  153.     the_hdr->priv.get.vert_skip;
  154.     the_hdr->priv.get.vert_skip = 0;
  155.  
  156.     if ( the_hdr->priv.get.is_eof )
  157.     return 32768;        /* too big for 16 bits, signal EOF */
  158.     else
  159.     return the_hdr->priv.get.scan_y;
  160. }
  161.